/*
 *  $Id: Region.cs 574 2009-06-25 10:38:55Z thenn.erannor $
 *  This file is a part of Ragima CCG.
 *  (C) 2008 Ragima development group.
 *
 *  Licensed under the terms of the GNU GPL License version 2.
 *
 */

using System;

using AgateLib.InputLib;
using AgateLib.Geometry;

namespace Ragima {
    /// <summary>
    /// Абстрактный регион (область на экране)
    /// Ловит события установки и снятия фокуса мыши, и может иметь горячую клавишу
    /// </summary>
    public class Region {
        private Rectangle _rect;
        private bool _focus;
        private KeyCode _hotKey;

        public Region(Rectangle rect) {
            _rect = rect;
            _focus = false;
            _hotKey = KeyCode.None;
        }

        public Rectangle Rect { get { return _rect; } set { _rect = value; } }
        public bool Focus { get { return _focus; } }
        public KeyCode HotKey { get { return _hotKey; } set { _hotKey = value; } }

        public Point MousePosition {
            get {
                Point mouse = Mouse.Position;
                return new Point(mouse.X - _rect.X, mouse.Y - _rect.Y);
            }
        }

        /// <summary>
        /// Получение строки подсказки для этого региона
        /// </summary>
        public virtual Hint GetHint() {
            return null;
        }

        /// <summary>
        /// Метод отрисовки региона
        /// </summary>
        public virtual void Draw() { }

        /// <summary>
        /// Метод отрисовки региона, если он является текущей целью
        /// </summary>
        public virtual void DrawTarget() { }

        /// <summary>
        /// Событие наведения курсора на регион
        /// </summary>
        public virtual void OnMouseEnter() {
            _focus = true;
        }
        /// <summary>
        /// Событие убирания курсора с региона
        /// </summary>
        public virtual void OnMouseLeave() {
            _focus = false;
        }

        /// <summary>
        /// Событие клика на регионе
        /// </summary>
        public virtual void OnClick() { }

        /// <summary>
        /// Событие отпускания клавиши мыши на регионе
        /// </summary>
        public virtual void OnClickUp() { }

        /// <summary>
        /// Событие правого клика на регионе
        /// </summary>
        public virtual void OnRightClick() { }

        /// <summary>
        /// Событие отпускания правой клавиши мыши на регионе
        /// </summary>
        public virtual void OnRightClickUp() { }

        /// <summary>
        /// Событие двойного клика на регионе
        /// </summary>
        public virtual void OnDoubleClick() { }

        /// <summary>
        /// Событие нажатия клавиши, заданной регионом (по умолчанию равно событию клика)
        /// </summary>
        public virtual void OnKeyPress() {
            OnClick();
        }

        /// <summary>
        /// Событие потиковой обработки
        /// </summary>
        public virtual void OnProcess() { }
    }

    /// <summary>
    /// Регион, относящийся к определенной сцене.
    /// </summary>
    public class Region<T>: Region where T: OldScene {
        private T _scene;

        public Region(Rectangle rect, T scene): base(rect) {
            _scene = scene;
        }

        public T Scene {
            get { return _scene; }
        }
    }
}
